import { InnerNotify } from "@/global/notificationHint"
import { localCache } from "./cacheData"
import AMapLoader from "@amap/amap-jsapi-loader"
import type LeftTable from "element-plus/es/components/table-v2/src/renderers/left-table.mjs"

/**
 * 利用navigator的geolocation获取位置信息
 * @returns 位置对象
 */
export function getCurrentPositions() {
  return new Promise<GeolocationPosition>((resolve, reject) => {
    if ("geolocation" in navigator) {
      /* 地理位置服务可用 */
      console.log("地理位置服务可用")
      navigator.geolocation.getCurrentPosition(
        function (position) {
          console.log("回调成功")
          console.dir(position) // 没有输出
          console.dir(position.coords.latitude, position.coords.longitude)
          localCache.setCache("userPosition", position)
          resolve(position)
        },
        function (error: GeolocationPositionError) {
          const errorMsg = showError(error)
          InnerNotify({
            title: "获取地址提醒",
            message: errorMsg,
            type: "error",
            position: "top-right"
          })
          reject()
        }
      )
    } else {
      /* 地理位置服务不可用 */
      console.error("地理位置服务不可用，请升级到支持该功能的浏览器")
      InnerNotify({
        title: "获取地址提醒",
        message: "地理位置服务可用，请升级到支持该功能的浏览器",
        type: "error",
        position: "top-right"
      })
      reject()
    }
  })
}

/**
 * 监测位置变化
 * @returns 位置对象
 */
export function watchPositions() {
  return new Promise<GeolocationPosition>((resolve, reject) => {
    if ("geolocation" in navigator) {
      /* 地理位置服务可用 */
      console.log("地理位置服务可用")
      navigator.geolocation.watchPosition(
        function (position) {
          console.log("回调成功")
          console.dir(position) // 没有输出
          console.dir(position.coords.latitude, position.coords.longitude)
          resolve(position)
        },
        function (error: GeolocationPositionError) {
          const errorMsg = showError(error)
          InnerNotify({
            title: "获取地址提醒",
            message: errorMsg,
            type: "error",
            position: "top-right"
          })
          reject()
        }
      )
    } else {
      /* 地理位置服务不可用 */
      console.error("地理位置服务可用，请升级到支持该功能的浏览器")
      InnerNotify({
        title: "获取地址提醒",
        message: "地理位置服务可用，请升级到支持该功能的浏览器",
        type: "error",
        position: "top-right"
      })
      reject()
    }
  })
}

/**
 * 显示错误信息
 * @param error
 * @returns 出错信息
 */
function showError(error: GeolocationPositionError) {
  let errorMessage = ""
  switch (error.code) {
    case error.PERMISSION_DENIED:
      errorMessage = `
          用户拒绝对获取地理位置的请求。
          请重新请求或检测浏览器设置以获取位置信息！
      `
      break
    case error.POSITION_UNAVAILABLE:
      errorMessage = "位置信息是不可用的。"
      break
    case error.TIMEOUT:
      errorMessage = "请求用户地理位置超时。"
      break
    default:
      errorMessage = "未知错误。"
      break
  }
  return errorMessage
}

/* ------------------- */
/**
 * 利用百度API获取位置信息
 */
export interface addressComponents {
  city: string
  district: string
  province: string
  street: string
  streetNumber: string
}
export function getCurrentPositionsByBaiDui() {
  return new Promise<any>((resolve, reject) => {
    // 获取当前定位城市--IP定位
    const BMap = window.BMap
    const myCity = new BMap.LocalCity()
    console.log(myCity)

    myCity.get(
      (r) => {
        console.log("经纬度信息", r)
        resolve(r)
        // 根据经纬度获取省和市
        // const gc = new BMap.Geocoder()
        // const pointAdd = new BMap.Point(r.center.lng, r.center.lat)
        // gc.getLocation(pointAdd, function (rs) {
        //   //获取城市地址
        //   console.log("城市信息", rs)
        //   resolve(rs)
        // })
      },
      (err) => {
        reject(err)
      }
    )
  })
}

/**
 * 利用高德API获取位置信息
 */
export function getCurrentPositionByAMap() {
  return new Promise((resolve, reject) => {
    // 首先，加载高德地图JS API
    AMapLoader.load({
      key: "9a1c1cbcf62c29381e7d9da3b8852b17", // 请替换成你的高德地图API Key
      version: "2.0",
      plugins: ["AMap.Geolocation", "AMap.Geocoder"] // 加载定位和地理编码插件
    })
      .then((AMap) => {
        // 使用高德地图定位服务获取当前位置
        const geolocation = new AMap.Geolocation({
          enableHighAccuracy: true, // 是否使用高精度定位，默认:true
          timeout: 10000 // 超过10秒后停止定位，默认：5s
        })

        console.log(AMap)

        geolocation.getCurrentPosition((status, result) => {
          if (status === "complete" && result && result.position) {
            console.log("经纬度信息", result.position)

            resolve(result.position)
            // 使用高德地图地理编码服务将经纬度解析为具体地址
            // const geocoder = new AMap.Geocoder()
            // geocoder.getAddress(result.position, (status, result) => {
            //   if (status === "complete" && result.regeocode) {
            //     console.log("城市信息", result.regeocode)
            //     resolve(result.regeocode)
            //   } else {
            //     reject(new Error("根据经纬度查询地址失败"))
            //   }
            // })
          } else {
            reject(new Error("定位失败"))
          }
        })
      })
      .catch((err) => {
        reject(err)
      })
  })
}
